// 打开手机蓝牙
export function openBluetooth() {
  // 初始化蓝牙
  return new Promise((resolve, reject) => {
    uni.openBluetoothAdapter({
      success: (res) => {
        // console.log(`打开蓝牙成功`, res);
        // 搜寻附近的蓝牙设备
        uni.startBluetoothDevicesDiscovery({
          services: [],
          success: (res) => {
            // console.log(`开始搜寻附近的蓝牙设备`);
            resolve(res);
          },
          fail: (err) => {
            // console.log(`开始搜寻附近的蓝牙设备失败`, err);
            reject(err);
          },
        });
      },
      fail: (err) => {
        console.log(`打开蓝牙失败`, err);
      },
    });
  });
}

// 蓝牙设备列表
export function blueDevices() {
  return new Promise((resolve, reject) => {
    uni.getBluetoothDevices({
      success: (res) => {
        // console.log(`蓝牙设备列表`, res);
        resolve(res);
      },
      fail: (err) => {
        // console.log(`获取蓝牙设备列表失败`, err);
        reject(err);
      },
    });
  });
}

/**
 * @param { String } id 设备id
 * @param { Boolean } state 设备状态
 **/
// 连接设备
export function createBLEC(id, state) {
  return new Promise((resolve, reject) => {
    closeBLEC(id, state); //// 先关闭蓝牙连接
    uni.createBLEConnection({
      deviceId: id,
      success: (res) => {
        // console.log(`连接成功`, res);
        resolve(res);
      },
      fail: (err) => {
        // console.log(`连接失败`, err);
        reject(err);
      },
    });
  });
}
/**
 *
 * @param { String } id // 设备id
 * @param { String } serverUUID // 服务id
 * @param { String } readId // 读取特征id
 * @returns
 */

//  订阅数据
export function notifyBLEC(id, serverUUID, readId) {
  uni.notifyBLECharacteristicValueChange({
    deviceId: id, // 设备的ID
    serviceId: serverUUID, // 服务的UUID
    characteristicId: readId,
    state: true,
  });
}

/**
 * @param { String } id 设备id
 * @param { Boolean } state 设备状态
 **/
// 关闭蓝牙连接
export function closeBLEC(id, state = false) {
  return new Promise((resolve, reject) => {
    // 关闭订阅和监听
    uni.offBLECharacteristicValueChange();
    try {
      if (state) {
        //先关闭蓝牙连接
        uni.closeBLEConnection({
          deviceId: id,
          success: (res) => {
            // console.log(`关闭连接成功`, res);
            resolve(res);
          },
        });
      }
    } catch (err) {
      console.log(`关闭连接报错`, err);
    }
  });
}

/**
 *
 * @param { String } id  // 设备id
 * @param { String } str  // 字符串
 * @param { String } serverUUID  // 服务id
 * @param { String } writeId  // 写入特征id
 * @returns
 */
// 向蓝牙设备写入数据
export function writeBLEC(id, str, serverUUID, writeId) {
  return new Promise((resolve, reject) => {
    uni.writeBLECharacteristicValue({
      deviceId: id, // 设备的ID
      serviceId: serverUUID, // 服务的UUID
      characteristicId: writeId, // 写特征的UUID
      value: str2ab(str), // 这里需要替换为实际要写入的数据
      success: (res) => {
        resolve(res);
      },
      fail: (err) => {
        // console.error("写入数据失败", err);
        reject(err);
      },
    });
  });
}

/**
 *
 * @param { String } id  // 设备id
 * @param { String } serverUUID  // 服务id
 * @param { String } readId  // 读取特征id
 * @returns
 */
// 从蓝牙设备读取数据
export function readBLEC(id, serverUUID, readId) {
  return new Promise((resolve, reject) => {
    uni.readBLECharacteristicValue({
      deviceId: id, // 设备的ID
      serviceId: serverUUID, // 服务的UUID
      characteristicId: readId, // 读特征的UUID
      success: (res) => {
        // console.log("读取到的数据", res);
        resolve(res);
      },
      fail: function (err) {
        // console.error("读取数据失败", err);
        reject(err);
      },
    });
  });
}

// str 转 buff
export function str2ab(str) {
  const buffer = new ArrayBuffer(str.length / 2);
  let x = new Uint8Array(buffer);
  for (let i = 0; i < x.length; i++) {
    x[i] = parseInt(str.substr(2 * i, 2), 16);
  }
  return buffer;
}
